﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cotizav.LogicaNegocio
{
    public class CotizacionBLL
    {
        public int Guardar(Entidades.Cotizacion newCotizacion, ref string codigoCotizacion)
        {
            if (!newCotizacion.IdTipoCotizacion.HasValue)
            {
                throw new ApplicationException("Seleccione el tipo de cotización.");
            }

            if (!newCotizacion.IdCliente.HasValue)
            {
                throw new ApplicationException("Ingrese el cliente.");
            }

            if (!newCotizacion.IdVendedor.HasValue)
            {
                throw new ApplicationException("Seleccione el vendedor.");
            }

            if (!newCotizacion.IdContacto.HasValue)
            {
                throw new ApplicationException("Seleccione el contacto.");
            }

            if (newCotizacion.ListCotizacionDetalle.Count == 0)
            {
                throw new ApplicationException("La cotización no tiene ingresado uno o más elementos en el detalle.");
            }

            if (newCotizacion.ListCondicionCotizacion.Count == 0)
            {
                throw new ApplicationException("La cotización no tiene ingresado uno o más elementos en la condición.");
            }

            AccesoDatos.CotizacionDAO cotizacionDAO = new AccesoDatos.CotizacionDAO();
            LogicaNegocio.PeriodoBLL periodoBLL = new LogicaNegocio.PeriodoBLL();
            LogicaNegocio.PeriodoDocumentoBLL periodoDocumentoBLL = new PeriodoDocumentoBLL();

            int resultado = 0;

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                ctx.LoadTransaction();
                Entidades.Periodo selPeriodo = periodoBLL.Obtener_PeriodoActivo(ctx);

                if (selPeriodo != null)
                {
                    Entidades.PeriodoDocumento selPeriodoDocumento = periodoDocumentoBLL.Listar(selPeriodo, ctx).FirstOrDefault(x => x.CodigoDocumento == "COTI");

                    if (selPeriodoDocumento != null)
                    {
                        //COTI-YYmm-XXXXX
                        newCotizacion.CodigoCotizacion = 
                            string.Format(
                                "{0}-{1}-{2}",
                                selPeriodoDocumento.CodigoDocumento,
                                string.Format("{0}{1}",selPeriodo.AnioPeriodo.ToString().Substring(2,2),selPeriodo.MesPeriodo.ToString().PadLeft(2,'0')),
                                selPeriodoDocumento.Correlativo.ToString().PadLeft(5,'0'));
                        newCotizacion.NumeroCotizacion = selPeriodoDocumento.Correlativo;

                        resultado = cotizacionDAO.Registrar(ctx, newCotizacion);

                        CotizacionDetalleBLL cotizacionDetalleBLL = new CotizacionDetalleBLL();
                        foreach (Entidades.CotizacionDetalle cd in newCotizacion.ListCotizacionDetalle)
                        {
                            resultado += cotizacionDetalleBLL.Registrar(ctx, newCotizacion, cd);
                        }

                        CotizacionCondicionBLL cotizacionCondicionBLL = new CotizacionCondicionBLL();
                        foreach (Entidades.CotizacionCondicion cc in newCotizacion.ListCondicionCotizacion)
                        {
                            resultado += cotizacionCondicionBLL.Registrar(ctx, newCotizacion, cc);
                        }

                        selPeriodoDocumento.Correlativo++;
                        resultado += periodoDocumentoBLL.ActualizarCorrelativo(selPeriodoDocumento, ctx);

                        ctx.ConfirmarTx();

                        codigoCotizacion = newCotizacion.CodigoCotizacion;
                    }
                    else
                    {
                        ctx.RechazarTx();
                    }
                }
                else
                {
                    ctx.RechazarTx();
                }               
            }

            return resultado;
        }

        public List<Entidades.Cotizacion> Listar(string condicion)
        {
            AccesoDatos.CotizacionDAO cotizacionDAO = new AccesoDatos.CotizacionDAO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return cotizacionDAO.Listar(ctx, condicion);
            }
        }

        public Entidades.Cotizacion Obtener(Entidades.Cotizacion selectedCotizacion)
        {
            AccesoDatos.CotizacionDAO cotizacionDAO = new AccesoDatos.CotizacionDAO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return cotizacionDAO.Obtener(ctx, selectedCotizacion).FirstOrDefault();
            }
        }
    }
}
